home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 7 / Amiga Format AFCD07 (Dec 1996, Issue 91).iso / serious / shareware / programming / emacs-complete / fsf / emacs / lib-src / hexl.c < prev    next >
C/C++ Source or Header  |  1994-06-23  |  4KB  |  239 lines

  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #ifdef MSDOS
  4. #include <fcntl.h>
  5. #endif
  6.  
  7. #define DEFAULT_GROUPING    0x01
  8. #define DEFAULT_BASE        16
  9.  
  10. #undef TRUE
  11. #undef FALSE
  12. #define TRUE  (1)
  13. #define FALSE (0)
  14.  
  15. int base = DEFAULT_BASE, un_flag = FALSE, iso_flag = FALSE, endian = 1;
  16. int group_by = DEFAULT_GROUPING;
  17. char *progname;
  18.  
  19. main (argc, argv)
  20.      int argc;
  21.      char *argv[];
  22. {
  23.   register long address;
  24.   char string[18];
  25.   FILE *fp;
  26.  
  27.   progname = *argv++; --argc;
  28.  
  29.   /*
  30.    ** -hex        hex dump
  31.    ** -oct        Octal dump
  32.    ** -group-by-8-bits
  33.    ** -group-by-16-bits
  34.    ** -group-by-32-bits
  35.    ** -group-by-64-bits
  36.    ** -iso        iso character set.
  37.    ** -big-endian    Big Endian
  38.    ** -little-endian    Little Endian
  39.    ** -un || -de    from hexl format to binary.
  40.    ** --        End switch list.
  41.    ** <filename>    dump filename
  42.    ** -        (as filename == stdin)
  43.    */
  44.     
  45.   while (*argv && *argv[0] == '-' && (*argv)[1])
  46.     {
  47.       /* A switch! */
  48.       if (!strcmp (*argv, "--"))
  49.     {
  50.       --argc; argv++;
  51.       break;
  52.     }
  53.       else if (!strcmp (*argv, "-un") || !strcmp (*argv, "-de"))
  54.     {
  55.       un_flag = TRUE;
  56.       --argc; argv++;
  57.     }
  58.       else if (!strcmp (*argv, "-hex"))
  59.     {
  60.       base = 16;
  61.       --argc; argv++;
  62.     }
  63.       else if (!strcmp (*argv, "-iso"))
  64.     {
  65.       iso_flag = TRUE;
  66.       --argc; argv++;
  67.     }
  68.       else if (!strcmp (*argv, "-oct"))
  69.     {
  70.       base = 8;
  71.       --argc; argv++;
  72.     }
  73.       else if (!strcmp (*argv, "-big-endian"))
  74.     {
  75.       endian = 1;
  76.       --argc; argv++;
  77.     }
  78.       else if (!strcmp (*argv, "-little-endian"))
  79.     {
  80.       endian = 0;
  81.       --argc; argv++;
  82.     }
  83.       else if (!strcmp (*argv, "-group-by-8-bits"))
  84.     {
  85.       group_by = 0x00;
  86.       --argc; argv++;
  87.     }
  88.       else if (!strcmp (*argv, "-group-by-16-bits"))
  89.     {
  90.       group_by = 0x01;
  91.       --argc; argv++;
  92.     }
  93.       else if (!strcmp (*argv, "-group-by-32-bits"))
  94.     {
  95.       group_by = 0x03;
  96.       --argc; argv++;
  97.     }
  98.       else if (!strcmp (*argv, "-group-by-64-bits"))
  99.     {
  100.       group_by = 0x07;
  101.       endian = 0;
  102.       --argc; argv++;
  103.     }
  104.       else
  105.     {
  106.       fprintf (stderr, "%s: invalid switch: \"%s\".\n", progname,
  107.            *argv);
  108.       usage ();
  109.     }
  110.     }
  111.  
  112.   do
  113.     {
  114.       if (*argv == NULL)
  115.     fp = stdin;
  116.       else
  117.     {
  118.       char *filename = *argv++;
  119.  
  120.       if (!strcmp (filename, "-"))
  121.         fp = stdin;
  122.       else if ((fp = fopen (filename, "r")) == NULL)
  123.         {
  124.           perror (filename);
  125.           continue;
  126.         }
  127.     }
  128.  
  129.       if (un_flag)
  130.     {
  131.       char buf[18];
  132.  
  133. #ifdef MSDOS
  134.       (stdout)->_flag &= ~_IOTEXT; /* print binary */
  135.       _setmode (fileno (stdout), O_BINARY);
  136. #endif
  137.       for (;;)
  138.         {
  139.           register int i, c, d;
  140.  
  141. #define hexchar(x) (isdigit (x) ? x - '0' : x - 'a' + 10)
  142.  
  143.           fread (buf, 1, 10, fp); /* skip 10 bytes */
  144.  
  145.           for (i=0; i < 16; ++i)
  146.         {
  147.           if ((c = getc (fp)) == ' ' || c == EOF)
  148.             break;
  149.  
  150.           d = getc (fp);
  151.           c = hexchar (c) * 0x10 + hexchar (d);
  152.           putchar (c);
  153.  
  154.           if ((i&group_by) == group_by)
  155.             getc (fp);
  156.         }
  157.  
  158.           if (c == ' ')
  159.         {
  160.           while ((c = getc (fp)) != '\n' && c != EOF)
  161.             ;
  162.  
  163.           if (c == EOF)
  164.             break;
  165.         }
  166.           else
  167.         {
  168.           if (i < 16)
  169.             break;
  170.  
  171.           fread (buf, 1, 18, fp); /* skip 18 bytes */
  172.         }
  173.         }
  174.     }
  175.       else
  176.     {
  177. #ifdef MSDOS
  178.       (fp)->_flag &= ~_IOTEXT; /* read binary */
  179.       _setmode (fileno (fp), O_BINARY);
  180. #endif
  181.       address = 0;
  182.       string[0] = ' ';
  183.       string[17] = '\0';
  184.       for (;;)
  185.         {
  186.           register int i, c;
  187.  
  188.           for (i=0; i < 16; ++i)
  189.         {
  190.           if ((c = getc (fp)) == EOF)
  191.             {
  192.               if (!i)
  193.             break;
  194.  
  195.               fputs ("  ", stdout);
  196.               string[i+1] = '\0';
  197.             }
  198.           else
  199.             {
  200.               if (!i)
  201.             printf ("%08x: ", address);
  202.  
  203.               if (iso_flag)
  204.             string[i+1] =
  205.               (c < 0x20 || (c >= 0x7F && c < 0xa0)) ? '.' :c;
  206.               else
  207.             string[i+1] = (c < 0x20 || c >= 0x7F) ? '.' : c;
  208.  
  209.               printf ("%02x", c);
  210.             }
  211.  
  212.           if ((i&group_by) == group_by)
  213.             putchar (' ');
  214.         }
  215.  
  216.           if (i)
  217.         puts (string);
  218.  
  219.           if (c == EOF)
  220.         break;
  221.  
  222.           address += 0x10;
  223.  
  224.         }
  225.     }
  226.  
  227.       if (fp != stdin)
  228.     fclose (fp);
  229.  
  230.     } while (*argv != NULL);
  231.   return 0;
  232. }
  233.  
  234. usage ()
  235. {
  236.   fprintf (stderr, "usage: %s [-de] [-iso]\n", progname);
  237.   exit (1);
  238. }
  239.